package com.bjsxt.shop.back.springmvc.interceptor;

import java.net.URLEncoder;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.bjsxt.shop.common.util.ConstatFinalUtil;
import com.bjsxt.shop.common.util.DateFormatUtil;
import com.bjsxt.shop.common.util.HttpUtil;
import com.bjsxt.shop.users.pojo.AAdmins;
import com.bjsxt.shop.users.service.IUsersService;

/**
 * 拦截器
 * @author WangshSxt
 *
 */
@Component("authInterceptor")
public class AuthInterceptor extends HandlerInterceptorAdapter
{
	@Resource
	private IUsersService usersService;
	
	@Resource
	private DateFormatUtil dateFormatUtil;
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
	{
		ConstatFinalUtil.SYS_LOGGER.info("==AuthInterceptor preHandle==");
		HttpSession session = request.getSession() ; 
		
		/* 先检查session是否有值 */
		AAdmins adminsSess = (AAdmins) session.getAttribute("admins");
		if(adminsSess != null)
		{
			return true ; 
		}
		
		/* token
		 * 如果有多个token:
		 * 取最后一个
		 *  */
		String[] tokens = request.getParameterValues("token");
		String token = "" ; 
		if(tokens != null)
		{
			token = tokens[tokens.length - 1]; 
		}
		
		/* 传入了token
		 * 就是从用户中心跳转过来的
		 *  */
		if(!"".equalsIgnoreCase(token))
		{
			/* 到token的颁发中心,去验证一下是不是你颁发的
			 * 验证token的接口,我们今天上午写过了
			 *  */
			HttpUtil httpUtil = new HttpUtil() ;
			
			/*
			 * 拼装上行的json
			 */
			JSONObject requestJSON = new JSONObject() ; 
			requestJSON.put("version", "1");
			
			JSONObject dataJSON = new JSONObject() ; 
			dataJSON.put("token", token);
			
			requestJSON.put("data", dataJSON);
			
			/* 拼装url */
			/*String url = "http://localhost:8080/userscenter-back/outer/json/verfiyToken.htm?json={%22version%22:%221%22,%22data%22:{%22token%22:%2226174d6f-2cac-4a00-99ff-7d79df12f38a%22}}" ;*/
			String url = ConstatFinalUtil.CONFIG_JSON.getString("userscenter.back.verifyToken.url");
			String params = "?json=" + requestJSON.toJSONString() ;
			url += params ;
			System.out.println("-----url----------" + url);
			String result = httpUtil.methodGet(url);
			System.out.println(result + "==============");
			/*
			 * 处理返回值
			 * 解析成json
			 *  */
			JSONObject resultJSON = (JSONObject) JSON.parse(result);
			/*
			 * code:0成功
			 * */
			if(resultJSON != null && "0".equalsIgnoreCase(resultJSON.getString("code")))
			{
				JSONObject dataResJSON = (JSONObject) resultJSON.get("data");
				JSONObject adminsJSON = dataResJSON.getJSONObject("admins");
				/*
				 * 将token的相关信息存储到客户端的session中
				 * 将商城自己的管理员对象存储到session中
				 * */
				/* 拿着token对应的adminsJSON它是在用户中心中的数据
				 * 拿着用户中心管理员的id(商城数据库里面的ssoId)
				 * 
				 * 查询一下商城的数据库里面有木有管理员.
				 * 如果有,更新,
				 * 如果木有,添加
				 *  */
				String ssoId = adminsJSON.get("id") + "";
				/* 
				 * 拿着用户中心管理员的id(商城数据库里面的ssoId)
				 * 
				 * 查询一下商城的数据库里面有木有管理员. */
				Map<String, Object> condMap = new HashMap<String, Object>();
				condMap.put("ssoId", ssoId);
				AAdmins adminsRes = this.usersService.findOneAdminsService(condMap);
				
				/*
				 * 断言
				 * 
				 * flag:true:添加
				 * false:更新
				 * */
				boolean flag = false ;
				if(adminsRes == null)
				{
					/* 数据库中不存在 */
					adminsRes = new AAdmins() ;
					/* 创建时间 */
					adminsRes.setCreateTime(new Date());
					flag = true ; 
				}
				
				adminsRes.setEmail(adminsJSON.getString("email"));
				adminsRes.setTrueName(adminsJSON.getString("name"));
				/* 如何将字符串变成Date */
				adminsRes.setLastLoginTime(this.dateFormatUtil.strDateTime(adminsJSON.get("lastLoginTime") + ""));
				adminsRes.setUpdateTime(new Date());
				
				/* 啥时候更新,
				 * 啥时候添加 */
				JSONObject resultDbJSON = null ; 
				if(flag)
				{
					/* 添加 */
					resultDbJSON = this.usersService.saveOneAdminsService(adminsRes);
				}else
				{
					/* 更新 */
					resultDbJSON = this.usersService.updateOneAdminsService(adminsRes);
				}
				
				ConstatFinalUtil.SYS_LOGGER.info("结果:{}",resultDbJSON);
				
				/* 存储的时候要存储对象 */
				session.setAttribute("admins", adminsRes);
				return true ; 
			}
		}
		
		/* 需要登陆
		 * 获取当前访问的URL
		 * 客户端跳转到用户中心的登陆页面,
		 * 把returnUrl带上,同时要加密哟(UrlEncode)
		 *  */
		String returnUrl = request.getRequestURL() + ""; 
		String queryStr = request.getQueryString() ; 
		/*?后面的参数木有了,
		 * 如何获取呢? 
		 * */
		if(queryStr != null)
		{
			returnUrl += "?" + queryStr ; 
		}
		System.out.println("=====returnUrl==========" + returnUrl);
		/*
		 * 客户端中转到用户中心
		 * http://xxxx:8080/userscenter-back/login.htm?returnUrl
		 * */
		String url = ConstatFinalUtil.CONFIG_JSON.getString("userscenter.back.login.url") ;
		url += "&returnUrl=" + URLEncoder.encode(returnUrl,"UTF-8") ; 
		System.out.println("=====url========" + url);
		response.sendRedirect(url);
		return false ; 
	}
}
